package cn.swing.his.operation.webapi.mapper;

import cn.swing.his.pojo.operation.dto.DoctorListDTO;
import cn.swing.his.pojo.operation.dto.OrderSettingDTO;
import cn.swing.his.pojo.operation.dto.PatientSimpleInfoDTO;
import cn.swing.his.pojo.operation.entity.Prescription;
import cn.swing.his.pojo.operation.entity.PrescriptionMedicine;
import cn.swing.his.pojo.operation.vo.*;
import cn.swing.his.pojo.user.vo.MedicalRecordVO;
import cn.swing.his.pojo.operation.entity.PatientCheckItem;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;

@Repository
public interface OperationMapper {
    /**********************************  insert   ******************************** */

    /**
     * 增加一个处方表-药品购买表
     * @param prescriptionMedicine
     * @return 受影响的行数
     */
    int insertPrescriptionMedicine(PrescriptionMedicine prescriptionMedicine);

    /**
     * 增加一个处方表
     * @param prescription
     * @return 受影响的行数
     */
    int insertPrescription(Prescription prescription);

    /**
     * 向处方表中插入药钱
     * @param totalPrice 总金额
     * @return 受影响的行数
     */
    int updateTotalPrice(@Param("totalPrice") Double totalPrice,@Param("prescriptionId")Integer prescriptionId);

    /**
     * 根据医生提供的表单为患者安排检查
     * @param patientCheckItem 患者的检查项
     * @return 受影响的行数
     */
    int insertCheckForPatient(PatientCheckItem patientCheckItem);


    /**
     * 插入患者信息
     * @param simpleInfoDTO 患者基本信息
     * @return 受影响行数
     */
    int insertPatientInfo(PatientSimpleInfoDTO simpleInfoDTO);


    /**
     * 插入预约信息
     * @param orderSettingDTO 简单信息
     * @return 受影响行数
     */
    int insertOrderSetting(OrderSettingDTO orderSettingDTO);
    /**********************************  delete   ******************************** */

    /**
     * 通过id删除预约信息
     * @param id 预约的id
     * @return  受影响行数
     */
    Integer deleteOrderSettingById(Integer id);

    /**
     *通过id 删除患者信息
     * @param id 患者id
     * @return 受影响行数
     */
    int deletePatientInfoById(Integer id);

    /**********************************  update   *********************************/


    /**
     * 根据预约表的id修改预约状态(预约完成)
     * @param  id 预约表id v4下 想人
     *
     * @return 受影响行数
     */
    int updateOrderSettingStateToFinishOrder(Integer id);
    /**
     * 根据预约表的id修改预约状态(就诊完成)
     * @param  id 预约表id
     * @return 受影响行数
     */
    int updateOrderSettingStateToFinishVisiting(Integer id);

    /**
     * 根据预约表的id修改预约状态(就诊中)
     * @param  id 预约表id
     * @return 受影响行数
     */
    int updateOrderSettingStateToSeeing(Integer id);

    /**
     * 收费时根据处方表id修改患者缴费状态
     * @param id 处方单id
     * @return 受影响的行数
     */
    int updatePrescriptionStateById(Integer id);


    /**
     * 修改患者信息
     * @param simpleInfoDTO 患者基本信息
     * @return 收影响行数
     */
    int updatePatientInfoByIdCard(PatientSimpleInfoDTO simpleInfoDTO);

    /**
     * 通过id 修改患者信息
     * @param patientInfoVO 要修改的信息
     * @return 受影响行数
     */
    int updatePatientInfoById(PatientInfoVO patientInfoVO);



    /**********************************  select   *********************************/

    /**
     * 根据医生的id查询预约该医生的预约信息
     * @param searchOrderVO 搜索信息
     * @return 预约信息
     */
    List<OrderSettingVO> getOrderSettingByDoctorId(SearchOrderVO searchOrderVO);


    /**
     * 根据用户id查询用户最新的处方单
     * @param userId 用户id
     * @return 处方单id
     */
    Integer getPrescriptionIdByUserId(Integer userId);



    /**
     * 根据医生的id查询该医生的排班信息
     * @param doctorId 医生id
     * @return 所有排班信息
     */
    List<SchedulingVO> getSchedulingByDoctorId(Integer doctorId);

    /**
     * 根据患者身份证查询患者病历
     * @param idCard 患者身份证
     * @return 病历单
     */
    List<MedicalRecordVO> getMedicalRecordByIdCard(String idCard);

    /**
     * 根据患者就诊卡号查询基本信息
     * @param patientId 就诊卡号
     * @return 患者简单信息
     */
    PatientSimpleInfoVO getPatientInfoByPatientId(Integer patientId);

    /**
     * 根据患者身份证查询基本信息
     * @param idCard 身份证id
     * @return 患者简单信息
     */
    PatientSimpleInfoVO getPatientInfoByIdCard(String idCard);

    /**
     * 查询所有的科室信息
     * @return 科室列表
     */
    List<RoomVO> getRoomSimpleInfo();

    /**
     * 查询所有门诊信息
     * @return 门诊列表
     */
    List<OutpatientServiceVO> getOutpatientServiceSimpleInfo();

    /**
     * 根据科室查询医生信息
     * @param doctorListDTO doctorListDTO
     * @return 医生列表
     */
    List<DoctorSimpleTempVO> getDoctorListByRoomId(DoctorListDTO doctorListDTO);

    /**
     * 根据预约表查询该医生已挂号数
     * @param doctorId 医生id
     * @return 数量
     */
    int getDoctorCountByDoctorId(Integer doctorId);

    /**
     * 根据就诊卡号查询病人过敏信息
     * @param id 就诊卡号
     * @return 过敏信息
     */
    String getPatientAllergenById(Integer id);

    /**
     * 根据就诊卡号查询患者历史患病信息
     * @param id 就诊卡号
     * @return 历史患病信息
     */
    List<PersonalSickRecordVO> getPatientSickRecordById(Integer id);


    /**
     * 查询当天预约人数
     * @param start 开始时间
     * @param end 结束时间
     * @return 人数
     */
    int getOrderSettingCount(String start, String end);


    /**
     * 查询就诊人数
     * @param start 开始时间
     * @param end 结束时间
     * @return 人数
     */
    int getFinishOrderSettingCount(String start, String end);

    /**
     * 根据时间查询近一个月各门诊的预约人数
     * @param time 时间
     * @return 对应的数
     */
    List<OrderSettingServiceVO> getOrderSettingServiceCount(String time);

    /**
     * 查询近七天的就诊人数
     * @return map
     */
    List<Map<String, String>> getCountOfNearlySevenDay();

    /**
     * 查询昨天的就诊人数
     * @return map
     */
    List<Map<String, String>> getCountOfYesterday();

    /**
     * 查询将要过期的药(30天)
     * @return 将要过期的药
     */
    List<MedicineSimpleVO> getMedicineThatWillExpire();

    /**
     * 查询数量少的药(少于10)
     * @return 少于10的药
     */
    List<MedicineSimpleVO> getMedicineThatLessNumbers();


    /**
     * 根据科室id查询所有医生
     * @param roomId 科室id
     * @return 所有医生
     */
    List<DoctorDetailVo> getDoctorDetailByRoomId(Integer roomId);

    /**
     * 根据电话号码查询患者
     * @param number 电话号码
     * @return 患者信息
     */
    List<PatientInfoVO> getPatientByTelephone(String number);

    /**
     * 根据电话号码查询预约信息
     * @param telephone 电话号码
     * @return 患者预约信息
     */
    List<OrderSettingVO> getOrderSettingVOByTelephone(String telephone);

    /**
     * 根据电话查询患者病史
     * @param telephone 电话号码
     * @return 患者病历
     */
    List<MedicalHistoryVO> getMedicalHistoryByTelephone(String telephone);

    /**
     * 根据电话查询患者就诊报告
     * @param telephone 电话
     * @return 就诊报告
     */
    List<MedicalReportVO> getMedicalReportByTelephone(String telephone);

    /**
     * 根据id查询患者信息(传参使用)
     * @param id 患者id
     * @return 患者信息
     */
    PatientVO getPatientInfoById(Integer id);

}
